/*
 * SPDX-FileCopyrightText: 2022-2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.format

import android.media.MediaFormat
import com.sanji.audio_test.extension.SAMPLE_RATE_HZ_MAX_COMPAT
import com.sanji.audio_test.extension.SAMPLE_RATE_HZ_MIN_COMPAT
import java.io.FileDescriptor

/**
 * WAV音频格式实现对象
 * 使用PCM编码的WAV格式，支持直通模式
 */
data object WaveFormat : Format() {
    // 格式名称
    override val name: String = "WAV/PCM"
    
    // 容器MIME类型
    // 应该是 "audio/vnd.wave" [1]，但Android只识别 "audio/x-wav" [2] 
    // 用于通过SAF创建文件时选择适当的文件扩展名
    // [1] https://datatracker.ietf.org/doc/html/rfc2361
    // [2] https://android.googlesource.com/platform/external/mime-support/+/refs/tags/android-12.1.0_r5/mime.types#571
    override val mimeTypeContainer: String = "audio/x-wav"
    
    // 音频MIME类型
    override val mimeTypeAudio: String = "audio/x-wav"
    
    // 是否支持直通模式（不重新编码）
    override val passthrough: Boolean = true
    
    // 参数信息，WAV格式不需要额外参数
    override val paramInfo: FormatParamInfo = NoParamInfo
    
    // 采样率信息
    override val sampleRateInfo: SampleRateInfo = RangedSampleRateInfo(
        // WAV采样率字段是4字节整数，理论上没有什么能阻止使用极高的采样率
        // 但我们坚持使用AudioRecord实际支持的范围
        arrayOf(SAMPLE_RATE_HZ_MIN_COMPAT.toUInt()..SAMPLE_RATE_HZ_MAX_COMPAT.toUInt()),
        16_000u,  // 默认采样率16kHz
    )

    /**
     * 更新媒体格式参数
     * WAV格式不需要额外处理
     */
    override fun updateMediaFormat(mediaFormat: MediaFormat, param: UInt) {
        // 不需要处理
    }

    /**
     * 获取容器对象
     * @param fd 文件描述符
     * @return WAV容器对象
     */
    override fun getContainer(fd: FileDescriptor): Container =
        WaveContainer(fd)
}